package com.diy.sigmund.diycommon.entity.base;

import com.diy.sigmund.diycommon.util.json.JacksonUtil;
import java.io.Serializable;
import org.apache.commons.lang3.builder.EqualsBuilder;
import org.apache.commons.lang3.builder.HashCodeBuilder;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;

/**
 * 该类的方法可以被子类使用，当子类没有覆盖的时候；
 * 子类若无特殊需求，可以只集成该类，就拥有hashCode、equals、toString；
 *
 * @author ylm-sigmund
 * @since 2021/9/13 20:47
 */
public class AbstractEntity implements Serializable {

    // private static final long serialVersionUID = 3957544026715546521L;
    private static final long serialVersionUID = 1L;

    @Override
    public boolean equals(Object o) {
        return EqualsBuilder.reflectionEquals(this, o);
    }

    @Override
    public int hashCode() {
        return HashCodeBuilder.reflectionHashCode(this);
    }

    /**
     * <br>项目中一般都需要打印日志，所有实体的toString()方法都是用简单的"+"，因为每"＋" 一个就会 new 一个 String 对象，这样如果系统内存小的话会暴内存。使用ToStringBuilder就可以避免暴内存这种问题。
     * <br>unicode的编码格式 \u5C0F\u660E
     * <br>统一码（Unicode），也叫万国码、单一码，是计算机科学领域里的一项业界标准，包括字符集、编码方案等。
     * <br>Unicode是为了解决传统的字符编码方案的局限而产生的，它为每种语言中的每个字符设定了统一并且唯一的 二进制编码 ，以满足跨语言、跨平台进行文本转换、处理的要求。
     * <br>
     * <br>ToStringStyle.JSON_STYLE {"id":null,"name":"\u5C0F\u660E","age":3}
     * <br>ToStringStyle.NO_CLASS_NAME_STYLE [id=<null>,name=小明,age=3]
     * <br>ToStringStyle.NO_FIELD_NAMES_STYLE com.diy.sigmund.diycommon.entity.PersonDTO@1990a65e[<null>,小明,3]
     * <br>ToStringStyle.DEFAULT_STYLE com.diy.sigmund.diycommon.entity.PersonDTO@1990a65e[id=<null>,name=小明,age=3]
     * <br>ToStringStyle.SIMPLE_STYLE <null>,小明,3
     * <br>ToStringStyle.SHORT_PREFIX_STYLE PersonDTO[id=<null>,name=小明,age=3]
     * <br>ToStringStyle.MULTI_LINE_STYLE com.diy.sigmund.diycommon.entity.PersonDTO@1990a65e[
     * <br>id=<null>
     * <br>name=小明
     * <br>age=3
     * <br>]
     *
     * @return String
     */
    @Override
    public String toString() {
        // return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE);
        return JacksonUtil.toJson(this);
    }
}
